#pragma once

#include <iostream>
#include <string>
#include <cstdarg>
#include <ctime>

enum
{
    Debug = 0,
    Info,
    Warning,
    Error,
    Fatal
};

std::string LevelToString(int level)
{
    switch (level)
    {
    case Debug:
        return "Debug";
    case Info:
        return "Info";
    case Warning:
        return "Warning";
    case Error:
        return "Error";
    case Fatal:
        return "Fatal";
    default:
        return "Unknown";
    }
}

class Log
{
public:
    Log() {}
    void LogMessage(int level, const char *format, ...) // 类C的一个日志接口
    {
        char content[1024];//定义了缓冲区
        va_list args; // va_list是一个宏，也是一个指针，在不同平台可能是char *或void *
        va_start(args, format);//第二个参数是离“...”最近的那一个，这一步是让args指向可变参数部分
        // args 指向了可变参数部分
        vsnprintf(content, sizeof(content), format, args);
        va_end(args); // args = nullptr;
        uint64_t currtime = time(nullptr);//获取当前的时间戳
        printf("[%s][%s]%s\n", LevelToString(level).c_str(),
               std::to_string(currtime).c_str(), content);
    }
    ~Log() {}

private:
};
